package common

import (
	"errors"
	"gitee.com/kinwyb/appTools/log"
	"github.com/dutchcoders/goftp"
	"path/filepath"
)

type Ftp struct {
	Address  string
	User     string
	Password string
	Path     string
	conn     *goftp.FTP
}

func (f *Ftp) Open() error {
	if f.conn != nil {
		return nil
	}
	log.AppTool.Debug("正在连接FTP...")
	ftp, err := goftp.Connect(f.Address)
	if err != nil {
		log.AppTool.WithError(err).Error("连接FTP失败")
		return err
	}
	log.AppTool.Debug("正在登录FTP...")
	err = ftp.Login(f.User, f.Password)
	if err != nil {
		log.AppTool.WithError(err).Error("FTP登录失败")
		ftp.Quit()
		return err
	}
	if f.Path != "" {
		log.AppTool.Debug("正在切换FTP目录到：", f.Path)
		err = ftp.Cwd(f.Path)
		if err != nil {
			log.AppTool.WithError(err).Error("FTP目录切换失败")
			ftp.Quit()
			return err
		}
	}
	// 开启Ftp开启UTF8编码
	ftp.RawCmd("OPTS UTF8 ON")
	f.conn = ftp
	return nil
}

func (f *Ftp) Close() {
	if f.conn != nil {
		f.conn.Quit()
		f.conn = nil
	}
}

// UploadFile ftp上传文件
func (f *Ftp) UploadFile(file string, ftpDir string) error {
	if f.conn == nil {
		return errors.New("请先使用Open方法打开FTP连接")
	}
	if ftpDir != "" {
		if f.Path == "" {
			f.Path = "/"
		}
		targetDir := filepath.Join(f.Path, ftpDir)
		log.AppTool.Debug("检测FTP上次目标文件夹是否存在:", targetDir)
		err := f.conn.Cwd(targetDir)
		if err != nil {
			err = f.conn.Mkd(targetDir)
			if err != nil {
				log.AppTool.WithError(err).Error("FTP创建目标文件夹失败")
				return err
			}
		}
		err = f.conn.Cwd(targetDir)
		if err != nil {
			log.AppTool.WithError(err).Error("FTP切换日期文件夹目录失败")
			return err
		}
	}
	log.AppTool.Debug("FTP开始上传文件...")
	err := f.conn.Upload(file)
	if err != nil {
		log.AppTool.WithError(err).Error("FTP文件上传失败")
		return err
	}
	log.AppTool.Debug("FTP文件上传成功")
	return nil
}

// DelFile ftp删除文件
func (f *Ftp) DelFile(file string, ftpDir string) error {
	if f.conn == nil {
		return errors.New("请先使用Open方法打开FTP连接")
	}
	if ftpDir != "" {
		if f.Path == "" {
			f.Path = "/"
		}
		targetDir := filepath.Join(f.Path, ftpDir)
		log.AppTool.Debug("检测FTP上次目标文件夹是否存在:", targetDir)
		err := f.conn.Cwd(targetDir)
		if err != nil {
			err = f.conn.Mkd(targetDir)
			if err != nil {
				log.AppTool.WithError(err).Error("FTP创建目标文件夹失败")
				return err
			}
		}
		err = f.conn.Cwd(targetDir)
		if err != nil {
			log.AppTool.WithError(err).Error("FTP切换日期文件夹目录失败")
			return err
		}
	}
	log.AppTool.Debug("FTP开始删除文件...")
	err := f.conn.Dele(file)
	if err != nil {
		log.AppTool.WithError(err).Error("FTP文件删除失败")
		return err
	}
	log.AppTool.Debug("FTP文件删除成功")
	return nil
}
